package com.cskaoyan.mr.relation;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @ClassName RelationMapper
 * @Description:
 * 郭靖 谢逊 林黛玉 杨过 左冷禅 黄蓉
 * 林黛玉 郭靖 张三丰
 * 谢逊 郭靖 张三丰
 * 黄蓉 郭靖 张三丰
 * 左冷禅 郭靖 张三丰 杨过
 * 杨过 郭靖 张三丰 小龙女 左冷禅
 * 张三丰 左冷禅 杨过 黄蓉 林黛玉 谢逊
 * 小龙女 杨过
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2023/2/13 15:50
 * @Version V1.0
 **/
public class RelationMapper extends Mapper<Object, Text, Text, IntWritable> {

    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] split = line.split(" ");
        for (int i = 1; i < split.length; i++) {
            String directFriend = combineName(split[0],split[i]);
            context.write(new Text(directFriend), new IntWritable(Relation.DIRECT_FRIEND));
            for (int j = i + 1; j < split.length; j++) {
                String undirectFriend = combineName(split[i], split[j]);
                context.write(new Text(undirectFriend), new IntWritable(Relation.UNDIRECT_FRIEND));
            }
        }
    }

    /**
     * 我们这里面需要做的事情便是组成一个好友关系的字符
     * 但是该字符不能够随着两个人的前后位置的不同而改变
     * 比如郭靖和谢逊，无论谁在前，最终组合在一起形成的字符串是固定的
     * 不能一次是郭靖-谢逊，另外一次是谢逊-郭靖
     * @param s1
     * @param s2
     * @return 最终需要保障无论哪个字符串在前，最终得到的结果是相同的
     */
    private String combineName(String s1, String s2) {
        if(s1.compareTo(s2) <= 0){
            return s1 + "-" + s2;
        }
        return s2 + "-" + s1;
    }
}
